home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / pascal / tegl6b.zip / INTROPAK.EXE / lha / EXECSWAP.ASM < prev    next >
Assembly Source File  |  1991-04-06  |  21KB  |  436 lines

  1. ;EXECSWAP.ASM
  2. ;  Swap memory and exec another program
  3. ;  Copyright (c) 1988 TurboPower Software
  4. ;  May be used freely as long as due credit is given
  5.  
  6. ;  See EXECSWAP.PAS for details of version history
  7. ;  Version 1.1 - 3/15/89
  8. ;  Version 1.2 - 3/29/89
  9. ;  Version 1.3 - 5/02/89
  10. ;-----------------------------------------------------------------------------
  11. DATA    SEGMENT WORD PUBLIC
  12.         EXTRN   BytesSwapped:DWORD      ;Bytes to swap to EMS/disk
  13.         EXTRN   EmsAllocated:BYTE       ;True when EMS allocated for swap
  14.         EXTRN   FileAllocated:BYTE      ;True when file allocated for swap
  15.         EXTRN   EmsHandle:WORD          ;Handle of EMS allocation block
  16.         EXTRN   FrameSeg:WORD           ;Segment of EMS page frame
  17.         EXTRN   FileHandle:WORD         ;Handle of DOS swap file
  18.         EXTRN   SwapName:BYTE           ;ASCIIZ name of swap file
  19.         EXTRN   PrefixSeg:WORD          ;Base segment of program
  20. DATA    ENDS
  21. ;-----------------------------------------------------------------------------
  22. CODE    SEGMENT WORD PUBLIC
  23.         ASSUME  CS:CODE,DS:DATA
  24.         PUBLIC  ExecWithSwap,FirstToSave
  25.         PUBLIC  AllocateSwapFile,DeallocateSwapFile
  26.         PUBLIC  DefaultDrive,DiskFree
  27.         PUBLIC  EmsInstalled,EmsPageFrame
  28.         PUBLIC  AllocateEmsPages,DeallocateEmsHandle
  29. ;-----------------------------------------------------------------------------
  30. FileAttr        EQU     6               ;Swap file attribute (hidden+system)
  31. EmsPageSize     EQU     16384           ;Size of EMS page
  32. FileBlockSize   EQU     32768           ;Size of a file block
  33. StkSize         EQU     128             ;Bytes in temporary stack
  34. lo              EQU     (WORD PTR 0)    ;Convenient typecasts
  35. hi              EQU     (WORD PTR 2)
  36. ofst            EQU     (WORD PTR 0)
  37. segm            EQU     (WORD PTR 2)
  38. ;-----------------------------------------------------------------------------
  39. ;Variables in CS
  40. EmsDevice       DB      'EMMXXXX0',0    ;Name of EMS device driver
  41. UsedEms         DB      0               ;1 if swapping to EMS, 0 if to file
  42. BytesSwappedCS  DD      0               ;Bytes to move during a swap
  43. EmsHandleCS     DW      0               ;EMS handle
  44. FrameSegCS      DW      0               ;Segment of EMS page window
  45. FileHandleCS    DW      0               ;DOS file handle
  46. PrefixSegCS     DW      0               ;Segment of base of program
  47. Status          DW      0               ;ExecSwap status code
  48. LeftToSwap      DD      0               ;Bytes left to move
  49. SaveSP          DW      0               ;Original stack pointer
  50. SaveSS          DW      0               ;Original stack segment
  51. PathPtr         DD      0               ;Pointer to program to execute
  52. CmdPtr          DD      0               ;Pointer to command line to execute
  53. ParasWeHave     DW      0               ;Paragraphs allocated to process
  54. CmdLine         DB      128 DUP(0)      ;Terminated command line passed to DOS
  55. Path            DB      64 DUP(0)       ;Terminated path name passed to DOS
  56. FileBlock1      DB      16 DUP(0)       ;FCB passed to DOS
  57. FileBlock2      DB      16 DUP(0)       ;FCB passed to DOS
  58. EnvironSeg      DW      0               ;Segment of environment for child
  59. CmdLinePtr      DD      0               ;Pointer to terminated command line
  60. FilePtr1        DD      0               ;Pointer to FCB file
  61. FilePtr2        DD      0               ;Pointer to FCB file
  62. TempStack       DB      StkSize DUP(0)  ;Temporary stack
  63. StackTop        LABEL   WORD            ;Initial top of stack
  64. ;-----------------------------------------------------------------------------
  65. ;Macros
  66. MovSeg          MACRO Dest,Src          ;Set one segment register to another
  67.         PUSH    Src
  68.         POP     Dest
  69.                 ENDM
  70.  
  71. MovMem          MACRO Dest,Src          ;Move from memory to memory via AX
  72.         MOV     AX,Src
  73.         MOV     Dest,AX
  74.                 ENDM
  75.  
  76. InitSwapCount   MACRO                   ;Initialize counter for bytes to swap
  77.         MovMem  LeftToSwap.lo,BytesSwappedCS.lo
  78.         MovMem  LeftToSwap.hi,BytesSwappedCS.hi
  79.                 ENDM
  80.  
  81. SetSwapCount    MACRO BlkSize           ;Return CX = bytes to move this block
  82.         LOCAL   FullBlk                 ;...and reduce total bytes left to move
  83.         MOV     CX,BlkSize              ;Assume we'll write a full block
  84.         CMP     LeftToSwap.hi,0         ;Is high word still non-zero?
  85.         JNZ     FullBlk                 ;Jump if so
  86.         CMP     LeftToSwap.lo,BlkSize   ;Low word still a block or more?
  87.         JAE     FullBlk                 ;Jump if so
  88.         MOV     CX,LeftToSwap.lo        ;Otherwise, move what's left
  89. FullBlk:SUB     LeftToSwap.lo,CX        ;Reduce number left to move
  90.         SBB     LeftToSwap.hi,0
  91.                 ENDM
  92.  
  93. NextBlock       MACRO SegReg, BlkSize   ;Point SegReg to next block to move
  94.         MOV     AX,SegReg
  95.         ADD     AX,BlkSize/16           ;Add paragraphs to next segment
  96.         MOV     SegReg,AX               ;Next block to move
  97.         MOV     AX,LeftToSwap.lo
  98.         OR      AX,LeftToSwap.hi        ;Bytes left to move?
  99.                 ENDM
  100.  
  101. EmsCall         MACRO FuncAH            ;Call EMM and prepare to check result
  102.         MOV     AH,FuncAH               ;Set up function
  103.         INT     67h
  104.         OR      AH,AH                   ;Error code in AH
  105.                 ENDM
  106.  
  107. DosCallAH       MACRO FuncAH            ;Call DOS subfunction AH
  108.         MOV     AH,FuncAH
  109.         INT     21h
  110.                 ENDM
  111.  
  112. DosCallAX       MACRO FuncAX            ;Call DOS subfunction AX
  113.         MOV     AX,FuncAX
  114.         INT     21h
  115.                 ENDM
  116.  
  117. InitSwapFile    MACRO
  118.         MOV     BX,FileHandleCS         ;BX = handle of swap file
  119.         XOR     CX,CX
  120.         XOR     DX,DX                   ;Start of file
  121.         DosCallAX 4200h                 ;DOS file seek
  122.                 ENDM
  123.  
  124. HaltWithError   MACRO Level             ;Halt if non-recoverable error occurs
  125.         MOV     AL,Level                ;Set errorlevel
  126.         DosCallAH 4Ch
  127.                 ENDM
  128.  
  129. MoveFast        MACRO                   ;Move CX bytes from DS:SI to ES:DI
  130.         CLD                             ;Forward
  131.         SHR     CX,1                    ;Convert to words
  132.         REP     MOVSW                   ;Move the words
  133.         RCL     CX,1                    ;Get the odd byte, if any
  134.         REP     MOVSB                   ;Move it
  135.                 ENDM
  136.  
  137. SetTempStack    MACRO                   ;Switch to temporary stack
  138.         MOV     AX,OFFSET StackTop      ;Point to top of stack
  139.         MOV     BX,CS                   ;Temporary stack in this code segment
  140.         CLI                             ;Interrupts off
  141.         MOV     SS,BX                   ;Change stack
  142.         MOV     SP,AX
  143.         STI                             ;Interrupts on
  144.                 ENDM
  145. ;-----------------------------------------------------------------------------
  146. ;function ExecWithSwap(Path, CmdLine : string) : Word;
  147. ExecWithSwap    PROC FAR
  148.         PUSH    BP
  149.         MOV     BP,SP                   ;Set up stack frame
  150.  
  151. ;Move variables to CS where we can easily access them later
  152.         MOV     Status,1                ;Assume failure
  153.         LES     DI,[BP+6]               ;ES:DI -> CmdLine
  154.         MOV     CmdPtr.ofst,DI
  155.         MOV     CmdPtr.segm,ES          ;CmdPtr -> command line string
  156.         LES     DI,[BP+10]              ;ES:DI -> Path
  157.         MOV     PathPtr.ofst,DI
  158.         MOV     PathPtr.segm,ES         ;PathPtr -> path to execute
  159.         MOV     SaveSP,SP               ;Save stack position
  160.         MOV     SaveSS,SS
  161.         MovMem  BytesSwappedCS.lo,BytesSwapped.lo
  162.         MovMem  BytesSwappedCS.hi,BytesSwapped.hi
  163.         MovMem  EmsHandleCS,EmsHandle
  164.         MovMem  FrameSegCS,FrameSeg
  165.         MovMem  FileHandleCS,FileHandle
  166.         MovMem  PrefixSegCS,PrefixSeg
  167.         InitSwapCount                   ;Initialize bytes LeftToSwap
  168.  
  169. ;Check for swapping to EMS or file
  170.         CMP     EmsAllocated,0          ;Check flag for EMS method
  171.         JZ      NotEms